package co.com.inventarios.logica;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Types;
import java.util.List;

import org.hibernate.Session;

import co.com.inventarios.modelo.Mngclase;
import co.com.inventarios.modelo.Probodega;
import co.com.inventarios.modelo.ProbodegaWork;
import co.com.inventarios.modelo.Producto;
import co.com.inventarios.modelo.ProductoWork;
import co.com.inventarios.modelo.Prounimed;
import co.com.inventarios.modelo.ProunimedWork;
import co.com.inventarios.persistencia.EntityManagerHelper;
import co.com.inventarios.persistencia.IProductoDAO;
import co.com.inventarios.persistencia.ProductoDAO;
import co.com.inventarios.persistencia.QueryMngclaseDAO;
import co.com.inventarios.persistencia.QueryProductoDAO;
import co.com.inventarios.utils.HibernateSessionFactory;

public class ProductoLogica implements IProductoLogica {

	Producto miProducto = new Producto();
	IProductoDAO lDAO = new ProductoDAO();

	public void grabarProducto(String codigo, String nombre, Long activo)
			throws Exception {

		miProducto.setProcodigo(codigo);
		miProducto.setPronombre(nombre);
		miProducto.setProactivo(activo);

		try {
			EntityManagerHelper.getEntityManager().getTransaction().begin();
			lDAO.save(miProducto);
			EntityManagerHelper.getEntityManager().getTransaction().commit();
		} catch (Exception ex) {
			ex.printStackTrace();
			EntityManagerHelper.getEntityManager().getTransaction().rollback();
		}

	}

	public String cargar_ProUnimed(String producto, String unidad) {
		Session session = HibernateSessionFactory.getSessionFactory()
				.getCurrentSession();
		session.getTransaction().begin();
		Connection con = session.connection();
		String retorno = "";
		try {
			CallableStatement call = con
					.prepareCall("{call PKG_MNG_INVENTARIO.cargar_prounimed_producto(?,?,?,?,?)}");
			call.setString(1, producto);
			call.setString(2, unidad);
			call.registerOutParameter(3, Types.INTEGER);
			call.registerOutParameter(4, Types.INTEGER);
			call.registerOutParameter(5, Types.CHAR);
			call.execute();

			retorno = call.getString(5);
			call.close();
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		session.getTransaction().commit();
		return retorno;
	}

	public List<Producto> buscarTodosProducto() throws Exception {
		return new ProductoDAO().findAll();
		// TODO Auto-generated method stub
	}

	public List<Producto> consultarProducto(String propiedad, String valor)
			throws Exception {
		return new ProductoDAO().findByProperty(propiedad, valor);
	}

	public void eliminarProducto(String codigo) throws Exception {
		miProducto.setProcodigo(codigo);

		try {
			EntityManagerHelper.getEntityManager().getTransaction().begin();
			lDAO.delete(miProducto);
			EntityManagerHelper.getEntityManager().getTransaction().commit();
		} catch (Exception ex) {
			ex.printStackTrace();
			EntityManagerHelper.getEntityManager().getTransaction().rollback();
		}

	}

	public Producto consultarRegProducto(String valor) throws Exception {
		return new ProductoDAO().findById(valor);
	}

	public ProductoWork[] findProductoSelectedRow(List<Producto> lista)
			throws Exception {
		ProductoWork doc;
		int max = lista.size();
		ProductoWork[] arrayDoc = new ProductoWork[max];
		if (lista != null) {
			for (int i = 0; i < max; i++) {
				doc = new ProductoWork();
				doc.setProductow(lista.get(i));
				arrayDoc[i] = doc;
			}
		}
		return arrayDoc;
	}

	public ProbodegaWork[] findProbodegaSelectedRow(List<Probodega> lista)
			throws Exception {
		ProbodegaWork doc;
		int max = lista.size();
		ProbodegaWork[] arrayDoc = new ProbodegaWork[max];
		if (lista != null) {
			for (int i = 0; i < max; i++) {
				doc = new ProbodegaWork();
				doc.setProbodegaw(lista.get(i));
				arrayDoc[i] = doc;
			}
		}
		return arrayDoc;
	}

	public ProunimedWork[] findProunimedSelectedRow(List<Prounimed> lista)
			throws Exception {
		ProunimedWork doc;
		int max = lista.size();
		ProunimedWork[] arrayDoc = new ProunimedWork[max];
		if (lista != null) {
			for (int i = 0; i < max; i++) {
				doc = new ProunimedWork();
				doc.setProunimedw(lista.get(i));
				arrayDoc[i] = doc;
			}
		}
		return arrayDoc;
	}

	public List<Producto> findAll(String expresion) throws Exception {
		return new QueryProductoDAO().findBy_all(expresion);
	}

	public List<Producto> findByPropertyAll(String propiedad, String valor,
			String expresion) throws Exception {
		return new QueryProductoDAO().findByPropertyAll(propiedad, valor,
				expresion);
	}

	public void Eliminar_Producto(Producto reg) throws Exception {
		try {
			EntityManagerHelper.getEntityManager().getTransaction().begin();
			new ProductoDAO().delete(reg);
			EntityManagerHelper.getEntityManager().getTransaction().commit();
		} catch (Exception ex) {
			ex.printStackTrace();
			EntityManagerHelper.getEntityManager().getTransaction().rollback();
		}

	}

	public void Guarda_Producto(Producto reg) throws Exception {
		try {
			EntityManagerHelper.getEntityManager().getTransaction().begin();
			new ProductoDAO().save(reg);
			EntityManagerHelper.getEntityManager().getTransaction().commit();
		} catch (Exception ex) {
			ex.printStackTrace();
			EntityManagerHelper.getEntityManager().getTransaction().rollback();
		}

	}

	public void Modifica_Producto(Producto reg) throws Exception {
		try {
			EntityManagerHelper.getEntityManager().getTransaction().begin();
			new ProductoDAO().update(reg);
			EntityManagerHelper.getEntityManager().getTransaction().commit();
		} catch (Exception ex) {
			ex.printStackTrace();
			EntityManagerHelper.getEntityManager().getTransaction().rollback();
		}

	}

	public Producto findByPropertyActivo(String propiedad, String valor)
			throws Exception {
		return new QueryProductoDAO().findByPropertyActivo(propiedad, valor);
	}

	public List<Producto> findByPropertyActivoLista(String propiedad)
			throws Exception {
		return new QueryProductoDAO().findByPropertyActivoLista(propiedad);
	}

}
